package aterrizar;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

import aterrizar.exceptions.CategoriaAvionInfructuosa;

public enum CategoriaAvion {

	AVION_LARGA_DISTANCIA("largaDistancia"),
	AVION_MEDIA_DISTANCIA("mediaDistancia"),
	AVION_CORTA_DISTANCIA("cortaDistancia");
	
	private static final String ARCHIVO_PROPIEDADES = "conf\\categoriasAvion.properties";

	private int minimaDistancia;
	private int maximaDistancia;
	private int intervalos;
	private int tiempoEntreEscalas;
	private int tiempoParado;
	private String categoria;

	private CategoriaAvion(String categoria) {
		this.categoria = categoria;
		crear();
	}

	/**
	 * Crea una <code>CategoriaAvion</code> con los datos de la configuracion
	 * @throws CategoriaAvionInfructuosa si no se puede crear la categoria con los datos de la Property 
	 */
	private void crear() { // throws CategoriaAvionInfructuosa {
		Properties propiedades = new Properties();
		
		try {
			FileInputStream archivo = new FileInputStream(ARCHIVO_PROPIEDADES);
			propiedades.load(archivo);
		} catch (IOException e) {
			//throw new CategoriaAvionInfructuosa();
			
			/**
			 * No hay forma de cargar el Properties lanzando Excepciones
			 * El compilador no permite que un Enum lanze excepciones 
			 */
			e.printStackTrace();
		}
		
		this.minimaDistancia = Integer.parseInt(propiedades.getProperty(categoria + ".minDistancia"));
		this.maximaDistancia = Integer.parseInt(propiedades.getProperty(categoria + ".maxDistancia"));
		this.intervalos = Integer.parseInt(propiedades.getProperty(categoria + ".intervalos"));
		this.tiempoEntreEscalas = Integer.parseInt(propiedades.getProperty(categoria + ".tiempoEntreEscalas"));
		this.tiempoParado = Integer.parseInt(propiedades.getProperty(categoria + ".tiempoParado"));
	}

	/**
	 * @return Distancia minima en Km
	 */
	public int getMinimaDistancia() {
		return minimaDistancia;
	}

	/**
	 * @return Distancia maxima en Km
	 */
	public int getMaximaDistancia() {
		return maximaDistancia;
	}

	public int getIntervalos() {
		return intervalos;
	}

	/**
	 * @return Tiempo maximo entre escalas, en horas
	 */
	public int getTiempoEntreEscalas() {
		return tiempoEntreEscalas;
	}

	/**
	 * @return Tiempo parado por revision tecnicas, en minutos
	 */
	public int getTiempoParado() {
		return tiempoParado;
	}

	/**
	 * @param distancia
	 * @return <code>true</code> si la distancia corresponde al rango de distancias
	 * validas para esta categoria
	 */
	public boolean comprobarDistancia(double distancia) {
		return minimaDistancia <= distancia && distancia <= maximaDistancia;
	}
	
	/**
	 * @return La maxima distancia de todas las categorias
	 */
	public static double getMaximaDistanciaCategoria() {
		double maximo = 0;
		for (CategoriaAvion categoria : CategoriaAvion.values()) {
			if (maximo < categoria.getMaximaDistancia())
				maximo = categoria.getMaximaDistancia();
		}
		return maximo;
	}
}
